#include "sdl.h"

namespace shipEngine
{
    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Inicjalizacja SDLa.
    */
    sdl::sdl()
    {
        if (SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            #ifdef DEBUG
                std::cout << "Nie mozna zainicjalizowac SDLa: " << SDL_GetError() << std::endl;
            #endif
        }
        lastsurfid = 0;
    }
    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Ustawienie rozdzielczości, oraz czy program ma być w oknie.
    */
    void sdl::setResolution(int x, int y, bool windowed)
    {
        Uint32 params;
        if(windowed)
        {
            params = SDL_HWSURFACE|SDL_DOUBLEBUF;
        }
        else
        {
            params = SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN;
        }
        // okienko :P
        screen = SDL_SetVideoMode(x, y, 32, params);
        xres=x;
        yres=y;
    }
    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Otwieranie obrazka(tylko BMP).
    */
    int sdl::openImage(std::string name)
    {
        lastsurfid++;
        images[lastsurfid] = new SDL_Surface;
        images[lastsurfid] = SDL_LoadBMP(name.c_str());
        return lastsurfid;
    }

    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Usuniecie obrazka z pamięci, nie trzeba wywolywac, ale jest to zalecane.
    */
    void sdl::destroyImage(int id)
    {
        if(id < MAX_SURFACES)
        {
            images[id] = NULL;
            return;
        }
        #ifdef DEBUG
            std::cout << "Id poza zakresem! Błąd krytyczny!" << std::endl;
        #endif
    }

    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Rysowanie obrazka.
    */
    void sdl::drawImage(int id, int x, int y)
    {
        if(id > MAX_SURFACES)
        {
            #ifdef DEBUG
                std::cout << "Id poza zakresem! Błąd krytyczny" << std::endl;
            #endif
            return;
        }
        SDL_Rect dst;
        dst.x=x;
        dst.y=y;
        // draw bitmap
        SDL_BlitSurface(images[id], 0, screen, &dst);
    }

    /**
    @author kapitan_hak <pawelluczkie@gmail.com>
    @brief Rysowanie sprite'a
    @param param Struktura zawierająca informacje o ułożeniu sprite'a na ekranie
    */
    void sdl::drawSprite(int id, sprite& param)
    {
        if(id > MAX_SURFACES)
        {
            #ifdef DEBUG
                std::cout << "Id poza zakresem! Błąd krytyczny" << std::endl;
            #endif
            return;
        }
        SDL_Rect r[2];
        r[0].x=param.srcx;
        r[0].y=param.srcy;
        r[0].w=param.w;
        r[0].h=param.h;

        r[1].x=param.dstx;
        r[1].y=param.dsty;
        SDL_SetColorKey(images[id], SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(images[id]->format, param.r, param.g, param.b));
        SDL_BlitSurface(images[id], &r[0], screen, &r[1]);
        #ifdef DEBUG
        std::cout << "srcx: " << param.srcx << std::endl
                  << "srcy: " << param.srcy << std::endl
                  << "w   : " << param.w    << std::endl
                  << "h   : " << param.h    << std::endl
                  << "dstx: " << param.dstx << std::endl
                  << "dsty: " << param.dsty << std::endl
                  << "col : " << param.r << " " << param.g << " " << param.b << std::endl
                  << "err : " << SDL_GetError() << std::endl
                  << "id  : " << id << std::endl
                  << "addr: " << images[id] << std::endl << std::endl;
        #endif
    }

    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Kopiowanie bufora na ekran.
    */
    void sdl::flip()
    {
        SDL_Flip(screen);
    }

    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Czyszczenie ekranu.
    */
    void sdl::clearScreen()
    {
        // wyczyść ekran
        SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
    }

    int sdl::getXres()
    {
        return xres;
    }

    int sdl::getYres()
    {
        return yres;
    }

    /**
    @author kaptian_hak <pawelluczkie@gmail.com>
    @brief Deinicjalizacja SDLa.
    */
    sdl::~sdl()
    {
        //delete [] images;
        SDL_Quit();
    }
}
